# a, b, c --> 形式参数

def fun(a, b, c):
    print('a=', a)
    print('b=', b)
    print('c=', c)


# 调用函数
# 实参根据位置传递给形参 --> 位置传参
fun(10, 20, 30)

# 定义一个列表
lst = [11, 22, 33]
# 在函数调用时，将列表中的每个元素都转换为位置实参传入
# 如果不加*，会将整个列表当做到一个对象传参，系统会报错
fun(*lst)


print('-------------------')
# 函数调用 --> 关键字实参
fun(a=100, c=50.2, b=7000)


# 定义一个字典
dic = {'a': 111, 'b': 222, 'c': 333}
# 在调用时，将字典中的键值对都转换为关键字实参传入，如果没有 ** 则会报错
# 如果不加**，会将整个字典当做到一个对象传参，系统会报错
# 在函数调用时，将字典中的键值对转换为关键字实参传入
fun(**dic)


def fun1(a, b=10):
    # b 是在函数定义处，所以 b 是形参，而且进行了赋值，所以 b 称为默认形参
    print('a', a)
    print('b', b)

# 个数可变的位置形参


def fun2(*args):
    print(args)


# 个数可变的关键字形参


def fun3(**args1):
    print(args1)


fun2(10, 20, 30, 50)
fun3(a=2, b=3, c=4, d=6)


def fun4(a, b, c, d):
    print(a)
    print(b)
    print(c)
    print(d)


# 调用fun4函数
# 位置实参传递
fun4(20, 30, 40, 50,)
# 关键字实参传递
fun4(a=20, b=30, c=40, d=50)
# 前两个参数，采用的是位置实参传递，而 c , d采用的是关键字实参传递
fun4(10, 20, c=30, d=60)


# 当出现 c , d 只能采用关键字实参传递时，可以使用以下方法

def fun5(a, b, *, c, d):
    # 从*之后的参数，在调用时，只能采用关键字
    print(a, b, c, d)


# 调用函数
fun5(50, 60, c=30, d=60)


# 函数定义时的形参的顺序
def fun6(a, b, *, c, d, **args3):
    pass


def fun7(*args, **args2):
    pass


def fun8(a, b=10, *args, **args2):
    pass
